package com.cskaoyan.javase.oop1._16access._4why;

/**
 * 单例的设计模式
 * 单例指的是在整个程序中,在整个JVM内存中,仅存在一个某个类的对象,这个对象叫做单例.
 *
 * 两种简单的单例模式实现:
 *      1.懒汉模式,指的是只有在确定要使用这个类对象时,才创建这个类对象
 *          这种单例模式,称之为懒汉模式
 *      2.饿汉模式,指的是在一开始,程序一启动,立刻就创建该类对象,无需在使用它时再创建
 *
 * @since 15:58
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) {
        Test t1 = Test.getTestInstance();
        Test t2 = Test.getTestInstance();

        Test2 t3 = Test2.getTest2Instance();
        Test2 t4 = Test2.getTest2Instance();
    }
}

// Test类的单例模式,懒汉模式
class Test {
    /*
        如果类的构造器是正常的,那么外界无法控制创建对象的次数
        所以单例模式下,类的构造器必须是私有的
        但是直接私有化构造器,会导致外界无法创建对象

        所以只能在类中写一个静态成员方法,用于获取该类的对象
        但是如果这个方法直接返回new对象,显然不是单例模式
        整个类全局唯一的变量是一个静态成员变量
        所以将自身类对象的引用作为自身类的静态成员变量
        然后在方法中返回它即可
     */
    private static Test t = null;

    private Test() {
    }

    public static Test getTestInstance() {
        // 懒汉模式
        if (t != null) {
            return t;
        }
        t = new Test();
        return t;
    }
}

// 饿汉模式
class Test2 {
    private static Test2 t = new Test2();

    private Test2() {
    }

    public static Test2 getTest2Instance() {
        return t;
    }
}